完美正方形

题目 完美正方形

image-1cf4ec5f

思路分析

写不了一点

代码实现

#include <iostream>

using namespace std;

int square[19] = {2, 5, 9, 11, 16, 17, 19, 21, 22, 24, 26, 30, 31, 33, 35, 36, 41, 50, 52};

int visited[19] = {0};

int grid[154][154] = {0};

bool solve()

{

  for(int i = 153; i >= 0; i--)

  {

    for(int j = 153; j >= 0; j--)

    {

      if(!grid[i][j])

        return 0;

    }

  }

  return 1;

}

bool judge(int hang, int lie, int square)

{

  if(hang + square > 154 || lie + square > 154)

    return 0;

  for(int i = hang; i < hang + square; i++)

  {

    for(int j = lie; j < lie + square; j++)

    {

      if(grid[i][j])

        return 0;

    }

  }

  return 1;

}

void fill(int hang, int lie, int square, int num)

{

  for(int a = hang; a < hang + square; a++)

  {

    for(int b = lie; b < lie + square; b++)

      grid[a][b] = num;

  }

}

bool DFS(int hang, int lie)

{

  if(solve())

    return 1;

  int end = 1;

  int a, b;

  for(a = hang; a < 154 && end; a++)

  {

    for(b = 0; b < 154 && end; b++)

    {

      if(!grid[a][b])

      {

        hang = a;

        lie = b;

        end = 0;

      }

    }

  }

  for(int i = 18; i >= 0; i--)

  {

    if(!visited[i] && judge(hang, lie, square[i]))

    {

      visited[i] = 1;

      fill(hang, lie, square[i], square[i]);

      if(DFS(hang, lie + square[i]))

        return 1;

      visited[i] = 0;

      fill(hang, lie, square[i], 0);

    }

  }

  return 0;

}

int main()

{

  fill(0, 0, 47, 47);

  fill(0, 47, 46, 46);

  fill(0, 93, 61, 61);

  DFS(46, 47);

  for(int i = 0; i < 154;)

  {

    cout << grid[153][i] << ' ';

    i += grid[153][i];

  }

  return 0;

}

同类题型

视频讲解


⬅️ 第六届蓝桥杯大赛软件赛决赛C/C++ 大学 B 组 🏠 00-冲刺国赛 ➡️ 密文搜索